#include <sys/epoll.h>
#include <sys/epoll.h>
//创建epoll模型
int epoll_create(int size);
//size: > 0的数就可以
//失败返回-1

//向内核中设置，需要关注的fd
int epoll_ctl(int epfd, int op, int fd,
                struct epoll_event * event);
struct epoll_event {
    uint32_t      events;  //需要关心的事件
    epoll_data_t  data;  
};
union epoll_data {
    void     *ptr;
    int       fd; //文件描述符
    uint32_t  u32;
    uint64_t  u64;
};

//epfd: epoll_create创建的返回值 （epoll模型）
//op  : 对文件描述符需要进行的行为
      //EPOLL_CTL_ADD - 添加
      //EPOLL_CTL_MOD - 修改
      //EPOLL_CTL_DEL - 删除‘
//fd: 文件描述符
//*event: 自己创建的结构体，只要给内核就可以了，不需要关注生命周期(局部创建也可以)
//失败返回-1


//获取准备就绪的fd
int epoll_wait(int epfd, struct epoll_event *events,
                int maxevents, int timeout);
//struct epoll_event *events 和 maxevents : 就是用户传入的数组，内核会把就绪的文件描述符从0开始返回到这个数组当中，maxevents为数组的长度
//timout: 阻塞的时间，不过对于ET模式我们直接设置为0
//返回值 -1: 代表读取失败了，关注已经释放掉了的fd??
         0 : timeout 到了
         >0 : 就绪的个数







